#!/usr/bin/env python3
"""
objectweb-asm3 MCP Server

面向 objectweb-asm3 软件的 MCP Server，提供对 objectweb-asm3 命令行操作的封装。

MCP tools 列表：
1. trace_class_visitor - 使用 TraceClassVisitor 分析 Java 类文件
   参数：class_name - 要分析的 Java 类名（如 java.lang.Void）
   返回：统一的命令执行结果 JSON

2. convert_bytecode_format - 在不同字节码格式之间转换
   参数：from_format - 源格式（code/xml/singlexml）
         to_format - 目标格式（code/xml/singlexml）
         input_file - 输入文件路径
         output_file - 输出文件路径
   返回：统一的命令执行结果 JSON
"""

import subprocess
import json
from typing import Dict, Any
from mcp.server.fastmcp import FastMCP, Context

mcp = FastMCP("ObjectWeb ASM3 MCP Server")

@mcp.tool()
def trace_class_visitor(class_name: str) -> Dict[str, Any]:
    """
    使用 TraceClassVisitor 工具分析指定的 Java 类文件
    
    参数:
        class_name: 要分析的 Java 类全名，如 java.lang.Void
    
    返回:
        JSON 结构:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        command = ["java", "-classpath", "asm.jar:asm-util.jar", 
                  "org.objectweb.asm.util.TraceClassVisitor", class_name]
        
        result = subprocess.run(
            command,
            cwd="/usr/share/java/objectweb-asm3",
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": f"java -classpath asm.jar:asm-util.jar org.objectweb.asm.util.TraceClassVisitor {class_name}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def convert_bytecode_format(from_format: str, to_format: str, input_file: str, output_file: str) -> Dict[str, Any]:
    """
    使用 objectweb-asm3-processor 在不同字节码格式之间转换
    
    参数:
        from_format: 源格式，可选值：code, xml, singlexml
        to_format: 目标格式，可选值：code, xml, singlexml  
        input_file: 输入文件路径
        output_file: 输出文件路径
    
    返回:
        JSON 结构:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 执行的完整命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        command = ["objectweb-asm3-processor", from_format, to_format, 
                  "-in", input_file, "-out", output_file]
        
        result = subprocess.run(
            command,
            cwd="/usr/share/java/objectweb-asm3",
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": f"objectweb-asm3-processor {from_format} {to_format} -in {input_file} -out {output_file}",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()